//二叉树剪枝
/*给你二叉树的根结点 root ，此外树的每个结点的值要么是 0 ，要么是 1 。

返回移除了所有不包含 1 的子树的原二叉树。

节点 node 的子树为 node 本身加上所有 node 的后代。
*/
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
 * right(right) {}
 * };
 */
class Solution {
public:
    void _pruneTree(TreeNode* root) {
        if (root == nullptr)
            return;
        _pruneTree(root->left);
        _pruneTree(root->right);
        TreeNode* RL = root->left;
        TreeNode* RR = root->right;
        if (RL && RL->left == nullptr && RL->right == nullptr && RL->val == 0) {
            root->left = nullptr;
        }
        if (RR && RR->left == nullptr && RR->right == nullptr && RR->val == 0) {
            root->right = nullptr;
        }
    }
    TreeNode* pruneTree(TreeNode* root) {
        _pruneTree(root);
        if (root && root->right == nullptr && root->left == nullptr &&
            root->val == 0)
            return nullptr;
            return root;
    }
};

//验证二叉搜索树
/*给你一个二叉树的根节点 root ，判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下：

节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
树中节点数目范围在[1, 104] 内
-231 <= Node.val <= 231 - 1
*/
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
 * right(right) {}
 * };
 */

class Solution {
    long long old = LLONG_MIN;
    long long cur = 0;

public:
    bool isValidBST(TreeNode* root) {
        if (root == nullptr)
            return true;
        bool left = isValidBST(root->left);
        cur = root->val;
        if (old >= cur)
            return false;
        old = cur;
        bool right = isValidBST(root->right);

        return left & right;
    }
};


//二叉搜索树中第 K 小的元素
/*给定一个二叉搜索树的根节点 root ，和一个整数 k ，请你设计一个算法查找其中第 k 小的元素（从 1 开始计数）*/
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
 * right(right) {}
 * };
 */

class Solution {
    long long old = LLONG_MIN;
    long long cur = 0;

public:
    bool isValidBST(TreeNode* root) {
        if (root == nullptr)
            return true;
        bool left = isValidBST(root->left);
        cur = root->val;
        if (old >= cur)
            return false;
        old = cur;
        bool right = isValidBST(root->right);

        return left & right;
    }
};




